import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
# from keras.datasets import fashion_mnist
from tensorflow import keras


def main1():
    '''
    y(x)=x^2
    :return:单个求导
    '''
    x = tf.Variable(initial_value=3.)    # 设置 x = 3  求导必须使用Variable定义参数
    print(x.numpy())    # tensor数据类型  用numpy 获取到具体值

    with tf.GradientTape() as tape:
        # 计算函数公式的结果值
        y = tf.square(x)      # 获取 y(x) = x^2  的结果

    print(y.numpy())   # 获取函数公式的结果值  3^2
    # 套用公式计算导数  gradient方法求导数
    y_grad = tape.gradient(y, x)   # y 是x平方的结果值,   求x==3是在函数  y = x^2 平方的导数,  结果为 导数等于 2x

    print([y, y_grad])
    print([y.numpy(), y_grad.numpy()])
    print(f"公式y=x^2, 当x为:{x.numpy()}, y的值为: {y.numpy()}, 求出导数是: {y_grad.numpy()}")


def main2():
    '''
    L = 0.5 * sum((X*w) + b - y)^2
    多元求导
    :return:
    '''
    X = tf.constant([[1, 2], [3., 4.]])
    y = tf.constant([[1], [2.]])
    w = tf.Variable(initial_value=[[1.], [2.]])
    b = tf.Variable(initial_value=1.)
    with tf.GradientTape() as tape:
        # 套入公式 求函数结果值   L = 0.5 * sum((X*w)^2 + b - y)
        # tf.matmul(x, w)  乘法,  tf.square() 平方  tf.reduce_sum  求和  按行求和
        L = 0.5 * tf.reduce_sum(tf.square(tf.matmul(X, w) + b - y))

    w_grad, b_grak = tape.gradient(L, [w, b])  # 求两个导数
    print(f"多元求导公式: L = 0.5 * sum((X*w) + b - y)^2")
    print(f"求 w, b 的导数: L为: {L.numpy()},\n w: {w_grad.numpy()}, b: ")
    print(b_grak.numpy())

if __name__ == '__main__':
    # main1()
    main2()


